package com.kaifamiao.reflect;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

public class GetMethod {

    public static void main(String[] args) throws Exception {

        Class<?> c = Class.forName( "com.kaifamiao.reflect.Child" );

        // 获得所有public修饰的方法组成的数组 (含从父类继承的public方法)
        Method[] methods = c.getMethods();
        for( Method m : methods ){
            show(m);
        }

        System.out.println( "- ".repeat( 20 ) );

        // 获得所有的方法组成的数组 (不受访问修饰符影响)
        methods = c.getDeclaredMethods();
        for( Method m : methods ){
            show(m);
        }

        System.out.println( "- ".repeat( 20 ) );

        // 从 public 方法(含从父类继承的public方法)中获取 指定名称、指定参数列表 的方法
        Method m = c.getMethod( "setName", String.class );
        show(m);

        System.out.println( "- ".repeat( 20 ) );

        // 从 c 类中获得 指定名称、指定参数列表 的 单个方法 (不受访问修饰符影响)
        m = c.getDeclaredMethod( "setAlived", boolean.class);
        show(m);

    }

    private static void show(Method m) {
        System.out.println( m.getName() );
        Class<?> dc = m.getDeclaringClass(); // 获得定义字段的类
        System.out.println( "\tdeclaring class: " + dc.getName() );
        System.out.println( "\tmodifiers: " + Modifier.toString( m.getModifiers() ) ); // 修饰符
        Class<?> rt = m.getReturnType(); // 返回类型
        System.out.println( "\treturn type: " + rt.getName() );
        Class<?>[] paramTypes = m.getParameterTypes();
        System.out.println( "\tparam types: " + Arrays.toString( paramTypes ) );
        Class<?>[] ets =  m.getExceptionTypes();
        System.out.println( "\texception types: " + Arrays.toString( ets ) );
    }

}
